package com.lock;

import java.sql.Time;
import java.util.concurrent.TimeUnit;

/**
 * @Author: sn
 * @Desc 测试notifyall之后同一锁的执行顺序
 * @Date: 2022/4/27
 */
public class TestWait4 {

    static  Object object = new Object();//锁对象
    static boolean isWoman = false; // 是否有女人
    static boolean isMoney = false; // 是否加钱了

    public static void main(String[] args) throws InterruptedException {
        new Thread(() -> {//jack
            synchronized (object){
                while (!isWoman){//判断是否有女人
                    //log.debug("没有女人 我去等待老板安排 先休息，安排好之后叫醒我");
                    System.out.println(String.format("{%s}-没有女人 我去等待老板安排 先休息，安排好之后叫醒我",Thread.currentThread().getName()));
                    try {
                        //jack线程进入阻塞，但是释放了锁
                        object.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                //log.debug("开始工作啪啪啪啪");
                System.out.println(String.format("{%s}-开始工作啪啪啪啪",Thread.currentThread().getName()));
            }
        }, "jack").start();
        TimeUnit.SECONDS.sleep(1);
        new Thread(() -> {//jack
            synchronized (object){
                while (!isWoman){//判断是否有女人
                    //log.debug("没有女人 我去等待老板安排 先休息，安排好之后叫醒我");
                    System.out.println(String.format("{%s}-没有女人 我去等待老板安排 先休息，安排好之后叫醒我",Thread.currentThread().getName()));
                    try {
                        //jack线程进入阻塞，但是释放了锁
                        object.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                //log.debug("开始工作啪啪啪啪");
                System.out.println(String.format("{%s}-开始工作啪啪啪啪",Thread.currentThread().getName()));
            }
        }, "tom").start();
        TimeUnit.SECONDS.sleep(1);
        new Thread(() -> {
            synchronized (object){
                while (!isMoney){
                    //log.debug("没有加钱，先休息不干活");
                    System.out.println(String.format("{%s}-没有加钱，先休息不干活",Thread.currentThread().getName()));
                    try {
                        object.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println(String.format("{%s}-干活了----有钱能使鬼推",Thread.currentThread().getName()));
            }
        }, "rose").start();

       /* //TimeUnit.SECONDS.sleep(1);//保证jeck执行
        for (int i = 0; i <5 ; i++) {
            new Thread(() -> {
                synchronized (object){
                    //log.debug("那些默默无闻的程序员coding");
                    System.out.println(String.format("{%s}-那些默默无闻的程序员coding",Thread.currentThread().getName()));
                }
            }, "程序员"+i).start();
        }*/

        //这里睡眠主要是为了视觉效果，没什么意义
        //5s之后叫醒jack
        TimeUnit.SECONDS.sleep(5);
        new Thread(() -> {//jack
            synchronized (object){
                isWoman=true;
                System.out.println("jack 桥本有菜来了，你可以啪啪啪了");
                object.notify();
            }
        }, "boss").start();

    }
}
